package libra;

import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.servlet.ServletComponentScan;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.ComponentScan.Filter;
import org.springframework.context.annotation.FilterType;
import org.springframework.web.client.RestTemplate;

//标注该类为SpringBoot的主配置类
@SpringBootApplication
//SpringBoot默认已开启事务，不需要自己手动开启
//@EnableTransactionManagement
//指定包扫描
@ComponentScan(value= {"libra"},excludeFilters = {@Filter( type = FilterType.REGEX, pattern="libra.serviceB.*" )} )
//扫描Servlet组件，java -jar形式运行必须开启 
@ServletComponentScan(value="libra")

// 通过SpringCloud原生注解@EnableDiscoveryClient开启服务注册、发现功能
//@EnableDiscoveryClient
/*
 * 使用'@EnableNacos'或'@EnableNacosDiscovery'开启NacosDiscovery服务注册发现功能
 * 如果在application.yml中配置了nacos.discovery.server-addr，则该注解配置可省略
 */
//@EnableNacos(globalProperties = @NacosProperties(serverAddr = "127.0.0.1"))
//@EnableNacosDiscovery(globalProperties = @NacosProperties(serverAddr = "127.0.0.1"))
public class MainEntry {
	/*
	 * 如果当前应用属于'服务消费者'，需要调用其他服务的接口功能
	 * 则需要在RestTemplate的bean定义上使用@LoadBalanced进行标注，开启客户端的负载均衡
	 * 否则在服务调用时，会因无法解析服务名而抛出UnknownHostException异常 
	 */
	@LoadBalanced
	@Bean
	public RestTemplate restTemplate() {
		return new RestTemplate();
	}

	public static void main(String[] args) {
		/*
		 * 启动Spring应用，返回一个ConfigurableApplicationContext的context对象，可以像原来一样从里面通过getbean等方法，获取对象
		 * run()传入的类，一定要是个用@SpringBootApplication注解标注的类，被@SpringBootApplication标注的类被解释为SpringBoot的主配置类。
		 * 当程序执行时，就应该运行该类的main方法来启动SpringBoot应用。
		 */
		ConfigurableApplicationContext cac = org.springframework.boot.SpringApplication.run(MainEntry.class, args);
	}
}
